// redux 库 主模块

// 根据指定的 reducer 函数 返回一个 store 对象
export function createStore(reducer){
    let state = reducer(undefined,{type:'@@/redux/init'})
    // 用例储存监听 state 更新回调函数的数组容器
    const listeners = []
    function getState(){
       return state;
    }

    // 分发 action 
    // 1 触发 reducer 调用 得到新 的 state 
    // 保存新的state
    // 调用 所有的 已存在 的监视回调函数 

    function dispatch(action ){
        const newState = reducer(state,action)
        state = newState
        listeners.forEach(listener=>listener())
    }
    function subscribe(listener){
        listeners.push(listener)
    }
    return  {
         getState,
         dispatch,
         subscribe
    }
}


/*
整合传入参数对象中的多个reducer函数, 返回一个新的reducer
新的reducer管理的总状态: {r1: state1, r2: state2}

reducers的结构:
{
  count: (state=2, action) => 3 ,
  user: (state={}, action) => {}
}
得到的总状态的结构
{
  count: count(state.count, action),
  user: user(state.user, action)
}
 */

// 整合多个 reducer 函数  产生一个新的 reducer 函数 
// 新的 reducer 函数 里面储存  一个总的状态
export function combineReducers(reducers){
  // 返回一个新的总reducer函数
  // state: 总状态
  return (state = {}, action) => {
    // ['count','user']
    // const newState = Object.keys(reducers).reduce((preState,key)=>{
    //     preState[key] = reducers[key](state[key],action)
    //     return preState
    // },{})
    // return newState;

    // 准备一个总状态空对象
    const totalState = {}
    // 执行reducers中每个reducer函数得到一个新的子状态, 并添加到总状态空对象
    Object.keys(reducers).forEach(key => {
      totalState[key] = reducers[key](state[key], action)
    })
    // 返回总状态对象
    return totalState
  }
}

export function combineReducers2(reducers) {
    return (state = {}, action) => {
      return Object.keys(reducers).reduce((totalState, key) => {
        totalState[key] = reducers[key](state[key], action)
        return totalState
      }, {})
    }
  }